package com.xbongbong.paas.toolbox.util;

import com.xbongbong.paas.toolbox.helper.PageHelper;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.constant.PageConstant;
import com.xbongbong.saas.constant.ParameterConstant;

import java.util.List;
import java.util.Map;

/**
 * PageHelper相关一些帮助方法
 * @author kaka
 * @time 2018-9-4 11:30
 */
public class PageHelperUtil {


    /**
     * 生成pageHelper，默认pageSize 20
     *
     * @return PageHelper
     */
    public static PageHelper getPageHelper(Map<String, Object> param, IModel iModel) {
        return getPageHelper(param, iModel, PageHelper.PAGE_SIZE);
    }

    /**
     * 生成pageHelper
     *
     * @return PageHelper
     */
    public static PageHelper getPageHelper(Map<String, Object> param, IModel iModel, Integer pageSize) {
        Integer rowCounts = iModel.getEntitysCount(param);
        Integer page = (Integer) param.get("page");
        if (page == null || page < 1) {
            page = 1;
        }
        param.put("page", page);
        return initPageHelper(rowCounts, page, pageSize);
    }

    /**
     * 生成pageHelper
     *
     * @return PageHelper
     */
    public static PageHelper getPageHelper(Map<String, Object> param, IModel iModel, Integer page, Integer pageSize) {
        Integer rowCounts = iModel.getEntitysCount(param);
        if (page == null || page < 1) {
            page = 1;
        }
        return initPageHelper(rowCounts, page, pageSize);
    }


    /**
     *
     * @param pageHelper 分页器
     * @param param 查询参数
     * @return 返回设置完查询条件链接的分页器
     */
    public static PageHelper setPageUriStr(PageHelper pageHelper, Map<String, Object> param) {
        return  pageHelper.setPageUriStr(CommentUtil.mapToUrl(param));
    }

    /**
     * 初始化PageHelper
     * @param rowCounts 总数
     * @param page 页码
     * @param pageSize 每页记录数
     * @param defaultPageSize 默认每页数量
     * @return com.xbongbong.paas.toolbox.helper.PageHelper
     * @author zcp
     * @date 2019/4/5 19:55
     * @since v1.0
     * @version v1.0
     */
    public static PageHelper initPageHelper(Integer rowCounts, Integer page, Integer pageSize, int defaultPageSize) {
        if (page == null || page < 1) {
            page = PageConstant.DEFAULT_INDEX_PAGE;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = defaultPageSize;
        }
        PageHelper pageHelper = new PageHelper(page, pageSize);
        if (rowCounts != null) {
            pageHelper.setRowsCount(rowCounts);
        }
        return pageHelper;
    }
    /**
     * 初始化pageHelper
     *
     * @return PageHelper
     */
    private static PageHelper initPageHelper(Integer rowCounts, Integer page, Integer pageSize) {
        return initPageHelper(rowCounts, page, pageSize, PageConstant.DEFAULT_PAGE_SIZE);
    }

    /**
     * 获取entityList
     *
     * @param param 参数集合
     * @return list
     */
    public static List<?> getEntityList(Map<String, Object> param, PageHelper pageHelper, IModel iModel) {
        param.put("pageNum", pageHelper.getPageSize());
        param.put("start", (pageHelper.getCurrentPageNum() - 1) * pageHelper.getPageSize());
        return iModel.findEntitys(param);
    }
    
    /**
     * 生成分组的pageHelper
     *
     * @return PageHelper
     */
    public static PageHelper getGroupPageHelper(Map<String, Object> param, Integer rowCounts, IModel iModel, Integer pageSize) {
        Integer page = (Integer) param.get("startGroup");
        if (page == null || page < 1) {
            page = 1;
        }
        param.put("startGroup", page);
        return initPageHelper(rowCounts, page, pageSize);
    }
    /**
     * 获取entityList
     *
     * @param param 参数集合
     * @return list
     */
    public static List<?> getGroupEntityList(Map<String, Object> param, PageHelper pageHelper, IModel iModel) {
        param.put("pageNumGroup", pageHelper.getPageSize());
        param.put("startGroup", (pageHelper.getCurrentPageNum() - 1) * pageHelper.getPageSize());
        return iModel.findEntitys(param);
    }
    
    /**
     * 获取列表并设置一个不准确的rowCount值，若命中的数据量大于等于start + pageSize * 5 则rowCount为start + pageSize * 5;
     * 若命中的数据量小于start + pageSize * 5 则rowCount为 start +  list.size()
     * 本次查询获取的列表数据量小于等于pageSize * 5，返回列表时剔除后面<=pageSize * 4的数据
     *
     * @param param      查询条件
     * @param pageHelper 分页插件
     * @param iModel     具体的业务model
     * @return 分页后的业务数据列表
     */
    public static List<?> getEntityListNoTotal(Map<String, Object> param,PageHelper pageHelper, IModel iModel) {
        Integer pageNum = pageHelper.getPageSize();
        Integer start = (pageHelper.getCurrentPageNum() - 1) * pageHelper.getPageSize();
        //需要获取pageSize * 5的数据，即5页数据
        param.put("pageNum", pageNum * 5);
        param.put("start", start);
        List<?> fivePageData = iModel.findEntitys(param);
        pageHelper.setRowsCount(start + fivePageData.size());
        if (fivePageData.size() <= pageNum) {
            return fivePageData;
        } else {
            return fivePageData.subList(0, pageNum);
        }
    }
}
